home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Source Code / C / Applications / MacWT 0.9 / wt Source / fixed.h < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-10  |  3.4 KB  |  130 lines  |  [TEXT/CWIE]

  1. /*
  2. **  MacWT -- a 3d game engine for the Macintosh
  3. **  © 1995, Bill Hayden and Nikol Software
  4. **
  5. **  On the Internet:
  6. **  bmoc1@aol.com (my personal address)
  7. **  nikolsw@grove.ufl.edu (my school address)
  8. **    MacWT anonymous FTP site: ftp.circa.ufl.edu/pub/software/ufmug/mirrors/LocalSW/Hayden/
  9. **  http://grove.ufl.edu:80/~nikolsw (my WWW page, containing MacWT info)
  10. **
  11. **  based on wt, by Chris Laurel (claurel@mr.net)
  12. **
  13. **  This program is distributed in the hope that it will be useful,
  14. **  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  16. */
  17.  
  18.  
  19. #ifndef FIXED_H_
  20. #define FIXED_H_
  21.  
  22. #include "limits.h"
  23.  
  24. /* fixed point conversions */
  25. #define INT_TO_FIXED(i) ((i) << 16)
  26. #define FIXED_TO_INT(f) ((f) >> 16)
  27. #define FIXED_TO_FLOAT(f) (((double) (f)) * 1.52587890625e-5)
  28. #define FLOAT_TO_FIXED(f) ((fixed) ((f) * 65536.0))
  29.  
  30. /* functions */
  31. #define FIXED_ABS(f) ((f) < 0 ? -(f) : (f))
  32. #define FIXED_TRUNC(f) ((f) & 0xffff0000)
  33. #define FIXED_SIGN(f) ((unsigned int) (f) >> 31)
  34. #define FIXED_PRODUCT_SIGN(f, g) ((unsigned int) ((f) ^ (g)) >> 31)
  35. #define FIXED_HALF(f) ((f) / 2)
  36. #define FIXED_DOUBLE(f) ((f) << 1)
  37.  
  38. /* perform integer scaling of a fixed point number */
  39. #define FIXED_SCALE(f, i) ((f) * (i))
  40.  
  41.  
  42. /* fixed point constants */
  43. #define FIXED_ZERO     (INT_TO_FIXED(0))
  44. #define FIXED_ONE      (INT_TO_FIXED(1))
  45. #define FIXED_ONE_HALF (FIXED_HALF(FIXED_ONE))
  46. #define FIXED_PI       (FLOAT_TO_FIXED(3.1415926536))
  47. #define FIXED_2PI      (FLOAT_TO_FIXED(6.2831853072))
  48. #define FIXED_HALF_PI  (FLOAT_TO_FIXED(1.5707963268))
  49. #define FIXED_MIN      LONG_MIN
  50. #define FIXED_MAX      LONG_MAX
  51.  
  52. /* we need this for kludges to avoid fixed point division overflow */
  53. #define FIXED_EPSILON  ((fixed) 0x100)
  54.  
  55. #define MIN(a, b) ((a) < (b) ? (a) : (b))
  56. #define MAX(a, b) ((a) > (b) ? (a) : (b))
  57.  
  58. typedef long fixed;
  59.  
  60.  
  61. #if GENERATING68K
  62.  
  63. // 68k Macintosh only
  64.  
  65. #pragma parameter __D0 fixmul(__D0,__D1)
  66. fixed fixmul(fixed a, fixed b) = 
  67. {
  68.     0x4C01,0x0C01,        // muls.L D1,D1:D0
  69.     0x3001,                // move.w D1,D0
  70.     0x4840                 // swap D0
  71. };
  72.  
  73. #pragma parameter __D1 fixmul2_30(__D0,__D1)
  74. fixed fixmul2_30(fixed a, fixed b) = 
  75. {
  76.     0x4C01,0x0C01,        // muls.L D1,D1:D0
  77.     0xE589                // lsl.L #2, D1
  78.         /* without the following lines, we're dropping the 
  79.            least signifigant 2 bits.  If this is a problem, 
  80.            uncomment them. 
  81.          */
  82.     //,0xE598            // rol.L #2, D0
  83.     //,0xEFC1, 0x0782    // bfins D0, D1{30,2}
  84. };
  85.  
  86.  
  87. #pragma parameter __D0 fixdiv(__D2,__D1)
  88. long fixdiv(fixed a, fixed b) =
  89. {
  90.     0x3002,             //    MOVE.W    D2,D0
  91.     0x4840,              //    SWAP      D0
  92.     0x4240,              //    CLR.W     D0
  93.     0x4842,              //    SWAP      D2
  94.     0x48C2,              //    EXT.L     D2
  95.     0x4C41, 0x0C02        //    DIVS.L    D1,D2:D0
  96. };
  97.  
  98.  
  99. #undef INT_TO_FIXED
  100. #undef FIXED_TO_INT
  101. #undef FIXED_TRUNC
  102.  
  103. #pragma parameter __D0 FIXED_TRUNC(__D0)
  104. fixed FIXED_TRUNC(fixed x) = 
  105.     0x4240;            // clr.W D0
  106.  
  107. #pragma parameter __D0 FIXED_TO_INT(__D0)
  108. signed short FIXED_TO_INT(fixed x) = 
  109.     0x4840;            // swap D0
  110.  
  111. #pragma parameter __D0 INT_TO_FIXED(__D0)
  112. fixed INT_TO_FIXED(signed short x) = 
  113. {
  114.     0x4840,            // swap D0
  115.     0x4240            // clr.w D0
  116. };
  117.  
  118. #else
  119.  
  120. /****************** Generic fixed point functions ********************/
  121.  
  122. #define fixmul(a, b) ((fixed) ((double) (a) * ((double) (b)) * 1.52587890625e-5))
  123. #define fixmul2_30(a, b) ((fixed) ((double) (a) * ((double) (b) * 9.313225746154785e-10)))
  124. #define fixdiv(a, b) ((fixed) (((double) (a) / (double) (b)) * 65536.0))
  125.  
  126. #endif // GENERATING68K
  127.  
  128.  
  129. #endif /* _FIXED_H_ */
  130.